package edu.zut.controller;

import edu.zut.pojo.UserInfo;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.validation.Valid;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 将其视为一个控制器（能控制一个或一组请求）
 * @Controller: 标注在类上，标明当前类是一个控制器类
 * @RequestMapping("/user"): 标注在类上时，表示路劲窄化
 */
@Controller
@RequestMapping("/user")
public class IndexController {

    /**
     * 每个方法都可以通过注解使其映射请求,和http相关的对象自带
     * @RequestMapping ：表示当前方法能够映射的请求
     *  value/path :映射的一个或一组请求
     *  method:表示请求的方式
     * @return  表示跳转的url
     */
//    @RequestMapping(path = "/user/login",method = RequestMethod.GET)
    public String userLogin(HttpServletRequest request){
        String uname = request.getParameter("uname");
        String password = request.getParameter("password");
        System.out.println("uname = " + uname);
        System.out.println("password = " + password);
        //url跳转
        return "/success.html";
    }

    /**
     * 通过处理方法的形参接收请求参数
     * 要求方法的形参名称和请求参数名称保持一致，类型兼容，自动封装
     * @return
     */
//    @RequestMapping(path = "/user/login",method = RequestMethod.GET)
    public String userLogin2(String uname,String password){
        System.out.println("uname = " + uname);
        System.out.println("password = " + password);
        //url跳转
        return "/success.html";
    }

    /**
     *如果形参名和请求参数名不一致？
     * 通过注解手动绑定
     * @RequestParam : 手动进行参数的绑定  根据name，此时默认要求请求中必须包含这个参数
     * 如果请求中可能不包含这个请求参数，将required = false
     */
    @RequestMapping(path = "/login",method = RequestMethod.GET)
    public String userLogin3(@RequestParam(name = "username",required = false) String uname, String password){
        System.out.println("uname = " + uname);
        System.out.println("password = " + password);
        //url跳转
        return "/success.html";
    }

    /**
     * 以实体Bean自动映射接收请求参数
     * 要求Bean里面的属性名和请求参数的名保持一致  类型兼容  set方法生成
     */
    @RequestMapping(value = "/register",method = RequestMethod.POST)
    public String register(@Valid UserInfo userInfo){
        System.out.println("userInfo = " + userInfo);
        //重定向
        return "redirect:/success.html";
    }

    /**
     * 从请求路劲中解析请求参数
     * @PathVariable  从请求路劲中解析参数
     */
    @GetMapping("/details/{num1}/{num2}")
    public String details(@PathVariable(name = "num1") String num, @PathVariable String num2){
        System.out.println("num1 = " + num);
        System.out.println("num2 = " + num2);
        return "/success.html";
    }

    /**
     * 处理请求的方法，返回值：void、String、基本数据类型、对象、集合
     * 同步请求中，一般返回的是String，表示的是跳转的url
     */
    @GetMapping("/to")
    public String to(){
        //默认转发   如果这个url资源不属于视图资源，添加forward,如果转发到视图，可以省略forward
        return "forward:toRegister";
    }

    @GetMapping("/toRegister")
    public String toRegister(){
        return "redirect:/register.html";
    }


    /**
     * 使用Thymeleaf模板后，html资源默认在templates下，这个目录默认不能被直接访问
     * 当用户跳转到Thymeleaf模板时，如果需要传递数据，可以将数据放到map中，当然，servlet中那一套照常使用
     * 返回视图模板时，模板的前缀/templates/ 不用写  后缀  .html也不写
     */
    @GetMapping("/toHello")
    public String toHello(Map<String,Object> map, HttpSession session){

        map.put("msg","欢迎访问Thymeleaf");
        UserInfo userInfo = new UserInfo();
        userInfo.setEmail("217815548@qq.com");
        session.setAttribute("userInfo",userInfo);
        UserInfo userInfo2 = new UserInfo();
        userInfo2.setEmail("217815547@qq.com");
        UserInfo userInfo3 = new UserInfo();
        userInfo3.setEmail("217815549@qq.com");
        List<UserInfo> list = new ArrayList<>();
        list.add(userInfo);
        list.add(userInfo2);
        list.add(userInfo3);
        map.put("userInfos",list);

        return "hello";
    }




    /**
     * 请求： 同步请求（页面刷新）   异步请求（页面不刷新）
     * 异步请求中的参数绑定 ?
     * 异步请求中：
     */





}
